<?php
/**
 * 유틸리티 - JavaScript
 *
 * @package util
 *
 * @author jylee3@simplexi.com
 * @version 1.0
 */
class utilJavascript
{
    /**
     * utilJavascript Instance
     *
     * @return    utilJavascript
     */
    public static function getInstance()
    {
        return utilSplClass::load('utilJavascript');
    }

    public function __construct() {}

    /**
     * 자바스크립트 실행코드 반환
     *
     * <code>
     * $utilJavascript = utilJavascript::getInstance();
     * $sJavascriptCode = $utilJavascript->javascript("alert('message')");
     * </code>
     *
     * @param    String    $sJavascriptCode    자바스크립트 코드
     *
     * @return    String    자바스크립트를 포함한 HTML 코드
     */
    public function javascript($sJavascriptCode)
    {
        return
            "
            <script type='text/javascript'>
                ".$sJavascriptCode."
            </script>
            ";
    }

    /**
     * document.write 자바스크립트 실행코드 반환
     *
     * <code>
     * $utilJavascript = utilJavascript::getInstance();
     * $sJavascriptCode = $utilJavascript->documentWrite('write message', true);
     * </code>
     *
     * @param    Mixed    $mJavascriptCode    자바스크립트 코드
     * @param    Boolean $bIsString    문자열 여부, 문자열이면 true, 문자열이 아닐 경우 false(기본값)
     *
     * @return    String    자바스크립트를 포함한 HTML 코드
     */
    public function documentWrite($mJavascriptCode, $bIsString=false)
    {
        $sDocumentWrite = ($bIsString===false)? "document.write(%s);" : "document.write('%s');";
        if (is_array($mJavascriptCode)) {
            $sJavascriptCode = '';
            foreach ($mJavascriptCode as $sJavascript) {
                $sJavascriptCode .= sprintf($sDocumentWrite,
                    ($bIsString===false)? sprintf($sJavascript) : sprintf(str_replace(array("\n", "'"), array('\\n', '\''), $sJavascript)));
            }
        } else {
            $sJavascriptCode = sprintf($sDocumentWrite,
                ($bIsString===false)? sprintf($mJavascriptCode) : sprintf(str_replace(array("\n", "'"), array('\\n', '\''), $mJavascriptCode)));
        }

        return $this->javascript($sJavascriptCode);
    }

    /**
     * histtory.back() 자바스크립트 실행코드 반환
     *
     * <code>
     * $utilJavascript = utilJavascript::getInstance();
     * $sJavascriptCode = $utilJavascript->historyBack('이전 페이지로 이동합니다.');
     * </code>
     *
     * @param    String    $sMsg    출력 메세지, 메세지를 지정하지 않을경우 경고창이 출력되지 않음
     *
     * @return    String    자바스크립트를 포함한 HTML 코드
     */
    public function historyBack($sMsg='')
    {
        $sJavascriptCode = "history.back();";

        if (!empty($sMsg))    $sJavascriptCode = "alert('".str_replace(array("\n", "'"), array('\\n', '\''), $sMsg)."');".$sJavascriptCode;

        return $this->javascript($sJavascriptCode);
    }

    /**
     * window.close() 자바스크립트 실행코드 반환
     *
     * <code>
     * $utilJavascript = utilJavascript::getInstance();
     * $sJavascriptCode = $utilJavascript->windowClose();
     * </code>
     *
     * @param bool   $bIsSelf 창을 닫을 웹브라우저의 self 참조 여부, 기본값(false)
     * @param string $sMsg    alert 메세지
     *
     * @return    String    자바스크립트를 포함한 HTML 코드
     */
    public function windowClose($bIsSelf=false, $sMsg='')
    {
        // alert
        if (strlen(trim($sMsg)) > 0) $sJavascriptCode = 'alert("' . $sMsg . '"); ';

        // window.close
        $sJavascriptCode .= ($bIsSelf===false)? "opener = window;\nwindow.close();" : "self.close();";

        return $this->javascript($sJavascriptCode);
    }

    /**
     * location.replace() 자바스크립트 실행코드 반환
     *
     * <code>
     * $utilJavascript = utilJavascript::getInstance();
     * $sJavascriptCode = $utilJavascript->locationReplace('www.naver.com', '네이버로 이동합니다.');
     * </code>
     *
     * @param    String    $sReplaceUrl    Replace URL
     * @param    String    $sMsg    출력 메세지, 메세지를 지정하지 않을경우 경고창이 출력되지 랂음
     * @param    String    $sPosition    Replace 대상, 지정하지 않을경우 location 객체
     *
     * @return    String    자바스크립트를 포함한 HTML 코드
     */
    public function locationReplace($sReplaceUrl, $sMsg='', $sPosition='')
    {
        $sAlertMsg = (empty($sMsg))? '' : "alert('".str_replace(array("\n", "'"), array('\\n', '\''), $sMsg)."');";

        $sLocationReplaceUrl = (empty($sPosition))?
            "location.replace('".$sReplaceUrl."');" : $sPosition.".location.replace('".$sReplaceUrl."');";

        $sJavascriptCode = $sAlertMsg.$sLocationReplaceUrl;

        return $this->javascript($sJavascriptCode);
    }
}